---
id: object-mapper
title: 13. 对象数据映射
sidebar_label: 13. 对象数据映射 Mapper
---

## 13.1 对象映射

简单来说，就是将一个对象的数据根据特定规则批量映射到另一个对象中，减少手工操作和降低人为出错率。如将 `DTO` 对象映射到 `Entity` 实体中，反之亦然。

## 13.2 先看例子

在过去，我们需要将一个对象的值转换到另一个对象中，我们需要这样做，如：

```cs
var entity = repository.Find(1);

var dto = new Dto();
dto.Id = entity.Id;
dto.Name = entity.Name;
dto.Age = entity.Age;
dto.Address = entity.Address;
dto.FullName = entity.FirstName + entity.LastName;
dto.IdCard = entity.IdCard.Replace("1234", "****");
```

上面的例子似乎没有任何问题，但是如果很多地方需要这样的赋值操作、或者相同的赋值操作在多个地方使用，又或者一个类中含有非常多的属性或自定义赋值操作。那么这样的操作效率极低，容易出错，且代码非常臃肿和冗余。

所以，实现自动映射赋值和支持特殊配置的需求就有了。目前 `C#` 平台有两个优秀的对象映射工具：`Mapster` 和 `AutoMapper`。**在 `Furion` 框架中，推荐使用 [Mapster](https://github.com/MapsterMapper/Mapster)，[Mapster](https://github.com/MapsterMapper/Mapster) 是一款极易使用且超高性能的对象映射框架。**

## 13.3 `Mapster` 使用

现在，我们可以通过 `Mapster` 提供的对象映射方法：`Adapt` 方法改造上面的例子：

:::important 安装拓展包

在 `Furion.Core` 层安装 `Furion.Extras.ObjectMapper.Mapster` 拓展包，无需手动调用，`Furion` 会自动加载并调用。

:::

### 13.3.1 快速入门

```cs
var entity = repository.Find(1);
var dto = entity.Adapt<Dto>();
```

仅仅一行代码就可以实现 `entity -> dto` 的转换，如果涉及到赋值的复制操作，如 `dto.FullName` 和 `dto.IdCard`，我们只需要自定义映射规则类即可。

### 13.3.2 自定义映射规则

```cs {1,6,10-12}
using Mapster;
using System;

namespace Furion.Application
{
    public class Mapper : IRegister
    {
        public void Register(TypeAdapterConfig config)
        {
            config.ForType<Entity, Dto>()
                .Map(dest => dest.FullName, src => src.FirstName + src.LastName)
                .Map(dest => dest.IdCard, src => src.IdCard.Replace("1234", "****"));
        }
    }
}
```

:::tip 小知识

该映射文件 `Mapper.cs` 可以放在任何项目或文件夹中，`Furion` 会在程序启动的时候自动扫描并注入配置。

:::

### 13.3.3 依赖注入方式

`Mapster` 除了提供 `Adapt` 拓展方法以外，同时还提供依赖注入的方式。

```cs
public  Person(IMapper mapper)
{
  var dto =  _mapper.Map<Dto>(entity);
}
```

### 13.3.4 和 `EFCore` 配合

`Mapster` 还提供了 `ProjectToType` Linq 拓展方法减少我们手动 `Select` 操作，如：

正常的操作：

```cs
var destinations = context.Sources
        .Select(p => new Destination {
            Id = p.Id,
            Name = p.Name,
            Surname = p.Surname,
            ....
        })
        .ToList();
```

使用 `Mapster` 之后：

```cs
 var destinations = context.Sources.ProjectToType<Destination>().ToList();
```

## 13.4 全局默认配置

`Furion` 提供全局默认映射配置选项 `TypeAdapterConfig.GlobalSettings.Default`，可在 `Startup` 中配置即可，如：

```cs
TypeAdapterConfig.GlobalSettings.Default
    .PreserveReference(true);
```

## 13.5 反馈与建议

:::note 与我们交流

给 Furion 提 [Issue](https://gitee.com/dotnetchina/Furion/issues/new?issue)。

:::

---

:::note 了解更多

想了解更多 `Mapster` 知识可查阅 [Mapster - Wiki](https://github.com/MapsterMapper/Mapster/wiki) 文档。

:::
